#include "Socket_Servidor.h"
/*
* Conecta con un servidor Unix, en la misma maquina. Recibe como parametro el path de donde se guardaria el socket a conectar (por las dudas
* 		crear un directorio ajeno al proyecto y tomar dicho dir como constante en donde se llame a este metodo).
* Deja el socket preparado para aceptar conexiones de clientes. Devuelve el descritor del socket servidor, que se debera pasar a la funcion
* Acepta_Conexion_Cliente(). Devuelve -1 en caso de error
*/
uint16_t Abre_Socket_Unix (char *Path){
	struct sockaddr_un Direccion;
	uint16_t Socket,length_path;

	/*
	* Se abre el socket
	*/
	Socket = socket (AF_UNIX, SOCK_STREAM, 0);
	if (Socket == -1){
	 	return -1;
	}
	/*
	* Se rellenan en la estructura Direccion los datos necesarios para
	* poder llamar a la funcion bind()
	*/
	strcpy (Direccion.sun_path, Path);
	Direccion.sun_family = AF_UNIX;
	length_path = strlen (Direccion.sun_path) + sizeof (Direccion.sun_family);
	unlink(Path);
	if (bind (Socket, (struct sockaddr *)&Direccion,length_path) == -1)	{
		/*
		* En caso de error cerramos el socket y devolvemos error
		*/
		perror("Error in bind Socket Server");
		close (Socket);
		return -1;
	}

	/*
	* Avisamos al sistema que comience a atender peticiones de clientes.
	*/
	if (listen (Socket, 1) == -1)	{
		close (Socket);
		return -1;
	}

	/*
	* Se devuelve el descriptor del socket servidor
	*/
	return Socket;
}

/*
* Se le pasa un socket de servidor y acepta en el una conexion de cliente.
* devuelve el descriptor del socket del cliente o -1 si hay problemas.
*/
uint16_t Acepta_Conexion_Cliente (uint16_t Socket){
	socklen_t Longitud_Cliente;
	struct sockaddr_un Cliente;
	uint16_t Hijo;

	/*
	* La llamada a la funcion accept requiere que el parametro 
	* Longitud_Cliente contenga inicialmente el tamano de la
	* estructura Cliente que se le pase. A la vuelta de la
	* funcion, esta variable contiene la longitud de la informacion
	* util devuelta en Cliente
	*/
	Longitud_Cliente = sizeof (Cliente);
	Hijo = accept (Socket, (struct sockaddr *) &Cliente, &Longitud_Cliente);
	if (Hijo == -1){
		return -1;
	}
	/*
	* Se devuelve el descriptor en el que esta "enchufado" el cliente.
	*/
	return Hijo;
}
